/**
 * 自定义简单的全局事件监听,订阅者发布者模式
 */ 
class subPub{
  cbArr = []
  // 监听一个事件
  on(eventName,callback){
    /**
     * 这里生成一个id返回，每一个监听on执行都有一个id返回，触发事件的时候如果传入id，就只触发唯一id的事件
     * 否者的话就按照eventName来触发，eventName可以有多个相同的，取消监听同理
     */ 
    const id = new Date().getTime()
    this.cbArr.push({
      id,
      eventName,
      callback,
    })
    return id
  }
  // 触发事件
  emit(eventName,params,id){
    this.cbArr.forEach(item=>{
      if(item.eventName!=eventName) return
      !id&&item.callback(params)||id&&id==item.id&&item.callback(params)
    })
  }
  // 关闭一个监听
  off(eventName,id){
    if(id){
      const index = this.cbArr.findIndex(item=>item.id==id&&item.eventName==eventName)
      index!==-1&&this.cbArr.splice(index,1)
    }else{
      this.cbArr = this.cbArr.filter(item=>item.eventName!==eventName)
    }
  }
  // 清除全部监听
  clear(){
    this.cbArr = []
  }
}
export default new subPub() 